package com.scalar.chiptrack.operations.dataentry.inventoryReceive.actioncommands;

import com.scalar.chiptrack.users.User;
import com.scalar.chiptrack.users.Functionality;
import com.scalar.chiptrack.actioncommands.ActionCommand;
import com.scalar.chiptrack.operations.dataentry.dao.DataEntryDAO;
import com.scalar.chiptrack.operations.dataentry.InTransitLots;
import com.scalar.chiptrack.operations.dataentry.LotDetails;
import com.scalar.chiptrack.operations.dataentry.inventoryReceive.forms.InventoryReceiveForm;
import com.scalar.chiptrack.operations.process.dao.ProductDao;
import com.scalar.chiptrack.operations.process.dao.NewProductDAO;
import com.scalar.chiptrack.operations.vendor.dao.VendorDAO;
import com.scalar.chiptrack.operations.release.dao.RelaseDAO;
import com.scalar.chiptrack.commons.SessionKeys;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.ArrayList;

/**
 * Created by IntelliJ IDEA.
 * User: ChandraSekhar
 * Date: Fed 06, 2008
 * Time: 12:28:08 PM
 */
public class InventoryReceiveLoadLotNumbersCommand extends ActionCommand
{
    private static final String ACTION_NAME = "/inventoryReceive.do" ;


    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception
    {
        InventoryReceiveForm invReceiveForm = (InventoryReceiveForm) form;

        HashMap<String, String> errors = new HashMap<String, String>();
        HashMap<String, String> info = new HashMap<String, String>();
        String action = request.getParameter("action");
        String previousPsType   = null;
        String locationType  = null;
        request.setAttribute(INFO_MESSAGES, info);
        request.setAttribute(ERROR_MESSAGES, errors);


        HttpSession mSession = request.getSession();
        User user = (User) mSession.getAttribute(SessionKeys.USER_KEY);

        if (user == null)
        {
            mSession.setAttribute(SessionKeys.SOURCE_PAGE_KEY, ACTION_NAME);
            return (mapping.findForward("login"));
        }
        else
        {
            if (user.isActionAllowed(Functionality.DATA_ENTRY, User.USER_ACTION_MODIFY))
            {
                request.setAttribute("showMessage", "FALSE");
            }
            else
            {
                request.setAttribute("showMessage", "TRUE");
            }
        }
        
        ArrayList<InTransitLots> transitLotList;
        LotDetails  lotDetails = new LotDetails();
        int processStepId  = -1;

        try
        {   
            if ( LOCATION_TYPE_ASSEMBLY.equalsIgnoreCase( invReceiveForm.getProcessType() ) )
            {
                 previousPsType = LOCATION_TYPE_DIE_BANK;
                 locationType = previousPsType;
            }
            else if ( LOCATION_TYPE_FT.equalsIgnoreCase( invReceiveForm.getProcessType() ) )
            {
                previousPsType = LOCATION_TYPE_ASSEMBLY;
                locationType = previousPsType;
            }
            else if ( LOCATION_TYPE_FPO.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                previousPsType = LOCATION_TYPE_FT;
                locationType = LOCATION_TYPE_TEST;
            }
            else if ( LOCATION_TYPE_TAPE_AND_REEL.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                previousPsType = LOCATION_TYPE_FPO;
                locationType = LOCATION_TYPE_TEST;
            }
            else if ( LOCATION_TYPE_FG.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                 previousPsType = LOCATION_TYPE_TAPE_AND_REEL;
                 locationType = LOCATION_TYPE_CLASS_STORE;
            }

            if ( invReceiveForm.getProcessStepId() > 0)
            {
                processStepId = NewProductDAO.getForwardOrBackwardProcessstepId( null,invReceiveForm.getProcessStepId(), 0, previousPsType );
            }
            else
            {
                  processStepId  = 0;
            }

            transitLotList = DataEntryDAO.loadAllTransitLots( previousPsType, processStepId+"", invReceiveForm.getLocationId(), invReceiveForm.getProcessType(), user.getVendorId(), invReceiveForm.getLotId() );

            if ( transitLotList == null || transitLotList.size() == 0 )
            {
                info.put("No "+previousPsType+" Transit lots available" , null );
            }
            
            invReceiveForm.setTransitLotsList( transitLotList );

            request.setAttribute("nextLocations", RelaseDAO.loadProcessVendors( locationType ) );
            request.setAttribute("processTypeList", lotDetails.getInventoryReceiveProcessList() );
            request.setAttribute("reciveProcessList", lotDetails.getReceiveProcessList() );
            request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( invReceiveForm.getProcessType() ) );
            request.setAttribute("locationList",    VendorDAO.getInventoryLocationsByProcessByUserType( null, locationType, 0 )  );
            request.setAttribute("action", action);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return mapping.findForward("inventoryReceive");
    }
}